#!/usr/bin/env python
# -*- coding: utf-8 -*-

# @Time     :2022/03/01
# @Author   :Changshu
# @File     :Exercise2.py
# 翻转链表
# 2. 两数相加
# 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
#
# 请你将两个数相加，并以相同形式返回一个表示和的链表。
#
# 你可以假设除了数字 0 之外，这两个数都不会以 0 开头。


class ListNode:
	def __init__(self,val=0,next=None):
		self.val=val
		self.next=next

def init():
	node1=ListNode(2)
	node2=ListNode(4)
	node3 = ListNode(3)
	node1.next=node2
	node2.next = node3
	return node1

def printListNode(head:ListNode):
	node=head
	while node:
		print(node.val,end=' ')
		node=node.next

def reverseList(head:ListNode):
	if not head:
		return None
	front,now,rear=None,head,head.next
	while now:
		now.next=front
		front=now
		now=rear
		if rear:
			rear=rear.next
	return front


if __name__ == '__main__':
	l=init()
	printListNode(l)
	l2=reverseList(l)
	print()
	printListNode(l2)




# 翻转链表
class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        reverse_l1,reverse_l2=self.reverse_list(l1),self.reverse_list(l2)
        # 结果
        res=ListNode()
        # 进位
        carry=0
        node1,node2,r=reverse_l1,reverse_l2,res
        while node1 or node2 or carry:
            n1,n2=0,0
            if node1:
                n1=node1.val
                node1=node1.next
            if node2:
                n2=node2.val
                node2=node2.next
            s=n1+n2+carry
            carry=s//10
            r.val=s%10
            if node1 or node2 or carry:
                r.next=ListNode()
                r=r.next
        return res

    # 翻转链表
    def reverse_list(self,l: ListNode):
        if not l:
            return None
        front,now,rear=None,l,l.next
        while now:
            now.next=front
            front=now
            now=rear
            if rear:
                rear=rear.next
        return front
